package blueq.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.HibernateException;

/**
 * 数据库访问基本接口，方法实现在BaseDaoImpl.java中
 * @version 1.1
 * @author 张帆
 */
public interface IBaseDao {

	/**
	 * 根据hql语句查询 ("from User as u where u.name=?", "test")
	 * 
	 * @param queryString
	 * @param values
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> findByHql(String queryString, Object... values)
	        throws HibernateException;

	@SuppressWarnings("unchecked")
	public <T> List<T> findByHql(String queryString, Object value);

	/**
	 * 根据对象实例查询 User u=new User(); u.setPassword("123") u.setName("bb") //必须
	 * 符合的条件但是这两个条件时并列的（相当于sql中的and）
	 * list=this.getHibernateTemplate().findByExample(u);
	 * 
	 * @param exampleEntity
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> findByExample(Object exampleEntity)
	        throws HibernateException;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public <T> List<T> findBySql(final String sql);

	/**
	 * 用带参数的普通SQL语句进行查询， 参数名和值对应
	 * 
	 * @param sql
	 * @param paramNames
	 * @param values
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> findBySql(final String sql, final String[] paramNames,
	        final Object[] values);

	/**
	 * 删除指定对象
	 * 
	 * @param obj
	 * @throws HibernateException
	 */
	public void deleteObject(Object obj) throws HibernateException;

	@SuppressWarnings("unchecked")
	public <T> List<T> findByHql(String hql);

	/**
	 * 根据ID号删除对象
	 * 
	 * @param <T>
	 * 
	 * @param class1
	 *            类名
	 * @param serializable
	 *            ID号
	 */
	public <T> void deleteObjectById(Class<T> class1, Serializable serializable);

	/**
	 * 根据SQL语句插入数据
	 * 
	 * @param sql
	 * @return
	 */
	public Integer insertBySql(final String sql);

	/**
	 * 添加或更新对象
	 * 
	 * @param obj
	 */
	public void saveOrUpdate(Object obj);

	/**
	 * 添加或更新对象集合
	 * 
	 * @param entities
	 */
	public <T> void saveOrUpdate(Collection<T> entities);

	/**
	 * 更新对象
	 * 
	 * @param obj
	 * @throws HibernateException
	 */
	public void updateObject(Object obj) throws HibernateException;

	/**
	 * 保存对象
	 * 
	 * @param obj
	 * @return
	 * @throws HibernateException
	 */
	public Serializable saveObject(Object obj) throws HibernateException;

	/**
	 * 根据ID获得指定类的对象
	 * 
	 * @param class1
	 * @param serializable
	 * @return
	 * @throws HibernateException
	 */
	public <T> T getObjectById(Class<T> class1, Serializable serializable)
	        throws HibernateException;

	/**
	 * 根据HQL语句查询
	 * 
	 * @param hsql
	 * @return
	 * @throws HibernateException
	 */
	public <T> List<T> hqlQuery(String hsql) throws HibernateException;

	/**
	 * 
	 * @param hsql
	 * @param obj
	 * @return
	 * @throws HibernateException
	 */
	public <T> List<T> hqlQuery(String hsql, Object obj)
	        throws HibernateException;

	/**
	 * 返回查询记录条数 hql = select count(*) from User as user（不建议使用）
	 * 
	 * @param hql
	 * @return
	 */
	public int getResultCount(String hql);

	/**
	 * 分页查询数据（不推荐使用）
	 * 
	 * @param hql 查询HQL语句
	 * @param beginIndex 记录开始位置
	 * @param pageSize 页大小
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> queryByPage(String hql, int beginIndex, int pageSize);


}